package com.zimin.cloud.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.zimin.cloud.template.CustomerTemplateEngine;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * windows 代码生成器
 *
 * @author zimin
 * @since 2021/10/13 4:25 下午
 */
public class WindowsMybatisGenerator {

    public static void main(String[] args) {
        Map<String, String> injectMap = new HashMap<>(10);
        injectMap.put("%sBO.java", "/templates/BO.java.ftl");
        injectMap.put("%sVO.java", "/templates/VO.java.ftl");
        injectMap.put("I%sBiz.java", "/templates/biz.java.ftl");
        injectMap.put("%sBizImpl.java", "/templates/bizImpl.java.ftl");
        injectMap.put("I%sController.java", "/templates/controllerApi.java.ftl");
        final String pathInfo = "D:\\code";
        DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig
                .Builder("jdbc:mysql://127.0.0.1:3306/zimin-cloud?useUnicode=true&characterEncoding=utf-8&useSSL=true" +
                "&serverTimezone=GMT%2B8", "root", "123456");
        FastAutoGenerator.create(dataSourceConfig).globalConfig(builder -> {
                    builder.author("zimin") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .disableOpenDir() //禁止打开输出目录
                            .outputDir(pathInfo) // 指定输出目录
                            .commentDate("yyyy-MM-dd HH:mm");
//                            .enableKotlin();

                })
                .packageConfig(builder -> {
                    builder.parent("com.zimin.cloud") // 设置父包名
                            .moduleName("wiki") // 设置父包模块名
                            .entity("pojo.entity") //设置entity包名
                            .mapper("mapper") //Mapper包名
                            .service("service") //service包名
                            .serviceImpl("service.impl") //service实现类包类
                            .controller("controller")
                            .other("other"); // 设置mapperXml生成路径
                })
                .templateConfig(builder -> {
                    builder.disable() //禁用所有模板
                            .entity("/templates/entity.java")
                            .service("/templates/service.java")
                            .serviceImpl("/templates/serviceImpl.java")
                            .mapper("/templates/mapper.java")
                            .xml("/templates/mapper.xml")
                            .controller("/templates/controller.java");
                })
                .strategyConfig(builder -> {
                    builder.addInclude("wiki_ebook","wiki_doc_info","wiki_doc","wiki_content","wiki_category") // 设置需要生成的表名
                            .addFieldPrefix("is_") //设置过滤字段前缀
                            .addTablePrefix("wiki_", "c_"); // 设置过滤表前缀
                    builder.controllerBuilder()
                            .superClass(" com.zimin.cloud.shared.pojo.BaseController")
                            .enableRestStyle(); //开启RestController 控制器
/*
                    builder.serviceBuilder()
                            .superServiceClass(" com.zimin.cloud.shared.pojo.BaseBiz")
                            .formatServiceFileName("I%sBiz") //格式化service 接口文件名称
                            .formatServiceImplFileName("%sBizImpl"); //格式化serviceImpl 接口文件名称
*/
                    builder.entityBuilder()
                            .superClass("com.zimin.cloud.mapper.pojo.BaseEntity")
                            .enableRemoveIsPrefix() //开启Boolean类型字段移除is前缀
                            .enableTableFieldAnnotation() //开启生成实体时生成字段注解
                            .logicDeleteColumnName("is_delete") //数据库 - 逻辑删除字段名称
                            .logicDeletePropertyName("delete") //实体类 - 逻辑删除字段名称
                            .versionColumnName("version") // 数据库 - 乐观锁字段名称
                            .versionPropertyName("version") // 实体类 - 乐观锁字段名称
                            .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认
                            .addSuperEntityColumns("id","create_time","update_time") // 添加父类中的公共字段
                            .addTableFills(new Column("create_time", FieldFill.INSERT)) //表字段填充
                            .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) //表字段填充
                            .idType(IdType.ASSIGN_ID) // 全局主键类型
                            .enableLombok(); //开启lombok模式
                })
                /* TODO:自定义注入配置*/
                .injectionConfig(builder -> builder.beforeOutputFile((tableInfo, objectMap) -> System.out.println("tableInfo:" + tableInfo.getEntityName() + "objectMap:" + objectMap)) //输出文件之前的消费者
                        .customMap(Collections.singletonMap("test", "test")) //自定义配置对象
                        .customFile(injectMap) // 业务对象
                        .build())
                .templateEngine(new CustomerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板 -- 配置自己的引擎方法
                .execute();
    }


}
